リストをソートするにはsorted関数を使用する。
sorted関数は、ソートしたリストを返す関数で、元になるリストは変更されない(immutable)。
一方リストにはsortメソッドがあり、リスト自体をソートする操作(mutable)もあるので注意。
>>> l = [3, 2, 5, 4, 1]
>>> sorted(l)
>>> [1, 2, 3, 4, 5]
>>> l
[3, 2, 5, 4, 1]
sorted関数は辞書(dict)のキーのソートやsetのソートにも使える。
>>> d = {'c': 10, 'b':1, 'a':30}
>>> sorted(d) #ソートされたキーのリストを返す
['a', 'b', 'c']
>>> d = set([3,1,2])
>>> d
set([1, 2, 3])
>>> sorted(d)
[1, 2, 3]
sorted関数のreverseをTrueにすれば逆順ソート。
>>> l = [3, 2, 5, 4, 1]
>>> sorted(l, reverse=True)
[5, 4, 3, 2, 1]
sorted関数のkeyを指定することで、任意の条件でソートすることができる。
key関数が返す値でソートされる。以下の例はHogeオブジェクトのname属性を返す関数を指定したことで、name属性でソートしている。
>>> class Hoge:
... def __init__(self, i, name):
... self.i = i
... self.name = name
... def __repr__(self):
... return "%d:%s" % (self.i, self.name)
...
>>> l2 = [Hoge(2, 'c'), Hoge(3, 'a'), Hoge(1, 'b')]
>>> l2
[2:c, 3:a, 1:b]
>>> sorted(l2, key=lambda h: h.name) #name属性を返す
[3:a, 1:b, 2:c]
上の例では、name属性を返す関数をlambda式で指定したが、特定の属性を返す関数は、operatorモジュールのattrgetter関数を使えば簡単に作成できる。
>>> import operator
>>> l2 = [Hoge(2, 'c'), Hoge(3, 'a'), Hoge(1, 'b')]
>>> sorted(l2, key=operator.attrgetter('name'))
[3:a, 1:b, 2:c]